template<class Entry>
struct Binary_node
{
	//data members:
	Entry data;
	Binary_node<Entry> *left;
	Binary_node<Entry> *right;
	//constructors:
	Binary_node();//...
	Binary_node(const Entry &x);//...
};

template<class Entry>
class Binary_tree
{
public:
	Binary_tree();
	bool empty() const;
	void preorder(void(*visit)(Entry &));//...
	void inorder(void(*visit)(Entry &));//...
	void postorder(void(*visit)(Entry &));//...

	int size() const;//...
	void clear();//...
	int height() const;//...
	void insert(const Entry &);//...
	int leaf_count() const;

	Binary_tree(const Binary_tree<Entry>&original);//...
	Binary_tree & operator = (const Binary_tree<Entry>&original);//...
protected:
	Binary_node<Entry> * root;
	void recursive_inorder(Binary_node<Entry>*sub_root,void(*visit)(Entry &));
	int recursive_size(Binary_node<Entry>*sub_root);
	int recursive_leaf_count(Binary_node<Entry>*sub_root);
	int recursive_height(Binary_node<Entry>*sub_root);
};